package com.yanghui.dtracing.core;

import com.yanghui.dtracing.core.log.ILog;
import com.yanghui.dtracing.core.log.LogManager;
import net.bytebuddy.matcher.ElementMatcher;

/**
*在某些情况下，一些框架和库也使用了一些二进制代码技术。从社区反馈来看，有一些
*它们与字节伙伴核心有兼容问题，触发“Cannot resolve type description”异常。
*所以我通过一个嵌套的匹配器来构建这个保护盾。当源匹配器不能解析类型时，
* 我们将忽略这些类型。
*注意:这个忽略机制可能会错过一些工具，但在大多数情况下，它是一样的。如果丢失的情况发生,
*请注意警告日志。
 * **/
public class ProtectiveShieldMatcher <T> extends ElementMatcher.Junction.AbstractBase<T> {

    private static final ILog log = LogManager.getLogger(ProtectiveShieldMatcher.class);

    private final ElementMatcher<? super T> matcher;

    public ProtectiveShieldMatcher(ElementMatcher<? super T> matcher) {
        this.matcher = matcher;
    }

    @Override
    public boolean matches(T target) {
        try {
            return this.matcher.matches(target);
        } catch (Throwable t) {
            if (log.isDebugEnable()) {
                log.debug("Byte-buddy occurs exception when match type.",t);
            }
            return false;
        }
    }
}
